package appvideo.persistencia;

import appvideo.logica.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Persistencia_Usuarios { 
    
    //Metodo que devuelve que tipo de usuario es dependiendo de dni y contraseña
    public static Usuario login(String dni, String password){
        Usuario u=null;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try {
            st = con.createStatement();
            rs = st.executeQuery("Select id,nombre,apellidos,dni,password,email,tlf,fecha_alta,tipo"
                        + " FROM personas "
                        + "WHERE personas.dni='"+dni+"' AND password='"+password+"' AND estado=1");
            
            if(rs.next()){
                if(rs.getInt("tipo")==1){
                    //Propietario
                    u = new Propietario(rs.getInt("id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),rs.getDate("fecha_alta"),rs.getString("password"));
                    
                }else if(rs.getInt("tipo")==2){
                    //Empleado
                    u = new Empleado(rs.getInt("id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),null,rs.getDate("fecha_alta"),rs.getString("password"));
                   
                    //Creacion salario empleado
                    rs = st.executeQuery("SELECT id,precio_hora,horas_trab,salario_bruto_mensual FROM salarios"
                            + " WHERE id_emp = "+((Empleado)u).getId()+"");
                    if(rs.next()){
                        Salario s = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                        ((Empleado)u).setSal(s);
                    }
                }else if(rs.getInt("tipo")==3){
                    //Socio
                    u = new Socio(rs.getInt("id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),rs.getDate("fecha_alta"),rs.getString("password"),null);
                    
                    //Creacion Tarjeta Socio
                    rs = st.executeQuery("SELECT num_tarjeta,puntos,credito FROM tarjetas WHERE id_socio="+((Socio)u).getId()+"");
                    if(rs.next()){
                        Tarjeta t = new Tarjeta(rs.getInt("num_tarjeta"),rs.getInt("puntos"),rs.getDouble("credito"));
                        ((Socio)u).setTarjetaSocio(t);
                    }
                    
                }
            }else{
                System.out.println("Error: Dni o contraseña erroneos");
            }
            
        }catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        
        return u;
    }
    
    
    
    //Devuelve una lista de usuarios que pueden ser empleados o socios(quizas algun dia propietarios).
    public static List<Usuario> getUsuarios(Usuario u){
        List<Usuario> usuarios=new ArrayList();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
            st = con.createStatement();
            if(u instanceof Empleado){
                //Esta consulta obtiene todos los datos necesarios para crear el empleado y su salario de la base de datos
                rs = st.executeQuery("Select nombre,apellidos,dni,password,email,tlf,fecha_alta,horas_trab,precio_hora"
                        + " FROM personas INNER JOIN salarios ON personas.id=salarios.id_emp WHERE personas.tipo=2 AND personas.estado=1;");

                while(rs.next()){
                    Salario s = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                    Empleado e = new Empleado(rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),s,rs.getDate("fecha_alta"),rs.getString("password"));
                    usuarios.add(e);
                }
            }
            else if(u instanceof Socio){
                //Esta consulta coge todos los datos necesarios para crear el socio y su tarjeta
                //Atencion: No devolvera nada si no hay socio o tarjeta asignada a un socio
                rs = st.executeQuery("Select nombre,apellidos,dni,password,email,tlf,fecha_alta,num_tarjeta,credito,puntos"
                        + " FROM personas INNER JOIN tarjetas ON personas.id=tarjetas.id_socio WHERE personas.tipo=3 AND personas.estado=1;");

                while(rs.next()){
                    Tarjeta t = new Tarjeta(rs.getInt("num_tarjeta"),rs.getInt("puntos"),rs.getDouble("credito"));
                    Socio s = new Socio(rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),rs.getDate("fecha_alta"),rs.getString("password"),t);
                    usuarios.add(s);
                }
            }
            
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        
        
        return usuarios;
    }
    //Busca un usuario
    public static Usuario buscaUsuario(String dni,Usuario u){
        Usuario usuario=null;

        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;

        try{
            st = con.createStatement();
            if(u instanceof Empleado){
                //Atencion: Devuelve los empleados con salario que estan dados de alta(estado=1) o baja(estado=2)
                rs = st.executeQuery("Select personas.id,nombre,apellidos,dni,password,email,tlf,fecha_alta,horas_trab,precio_hora"
                        + " FROM personas INNER JOIN salarios ON personas.id=salarios.id_emp "
                        + "WHERE personas.dni='"+dni+"' AND personas.tipo=2");
                if(rs.next()){
                    Salario s = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                    usuario = new Empleado(rs.getInt("id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),s,rs.getDate("fecha_alta"),rs.getString("password"));
                }
            }
            else if(u instanceof Socio){
                //Atencion: Devuelve los empleados con salario que estan dados de alta(estado=1) o baja(estado=2)
                rs = st.executeQuery("Select personas.id,nombre,apellidos,dni,password,email,tlf,fecha_alta,num_tarjeta,credito,puntos"
                        + " FROM personas INNER JOIN tarjetas ON personas.id=tarjetas.id_socio "
                        + "WHERE personas.dni='"+dni+"' AND personas.tipo=3");
                if(rs.next()){
                    Tarjeta t = new Tarjeta(rs.getInt("num_tarjeta"),rs.getInt("puntos"),rs.getDouble("credito"));
                    usuario = new Socio(rs.getInt("personas.id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                            rs.getString("email"),rs.getInt("tlf"),rs.getDate("fecha_alta"),rs.getString("password"),t);
                }
            }
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }finally{
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            } 
        }

        return usuario;
    }
    //Inserta o actualiza a un usuario de la base de datos
    public static boolean altaUsuario(Usuario u){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
        
        try {
                st=con.createStatement();
                if(u instanceof Empleado){
                    //INSERCION DE EMPLEADOS
                    //Comprobar si empleado esta en la base de datos
                    rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.dni = '"+u.getDni()+"' AND personas.tipo=2 "); 
                    rs.next();
                    if(rs.getInt(1)==1){
                        //El empleado estaba dado de alta en la base de datos.
                        //HACER UPDATE DEL EMPLEADO
                        String query = "UPDATE personas SET estado = 1,nombre='"+u.getNombre()+"', apellidos='"+u.getApellidos()+"', dni='"+u.getDni()+"',email='"+u.getEmail()+"',tlf="+u.getTlf()+", fecha_alta='"+dt.format(((Empleado)u).getfAlta())+"'"
                                + " WHERE personas.tipo=2 AND personas.dni='"+u.getDni()+"'";
                        st.executeUpdate(query);
                        ret = true;
                    }else if(rs.getInt(1)==0){
                        //El empleado no existe en la base de datos
                        //HACER INSERCION DE SALARIO Y EMPLEADO

                        //INSERCION EMPLEADO
                        st.executeUpdate("INSERT INTO personas (dni,password,nombre,apellidos,tlf,email,fecha_alta,tipo,estado) "
                                + "VALUES ('"+u.getDni()+"','"+u.getPassword()+"','"+u.getNombre()+"','"+u.getApellidos()+"',"+u.getTlf()+",'"+u.getEmail()+"','"+dt.format(((Empleado)u).getfAlta())+"',2,1)");
                        //CONSULTA PROXIMO ID A INSERTAR(Llevar control del id en las dos tablas que inserto al mismo tiempo)
                        rs = st.executeQuery("SELECT MAX(id) FROM PERSONAS");
                        rs.next();
                        int id_emp = rs.getInt(1); 
                        //INSERCION SALARIO
                        st.executeUpdate("INSERT INTO salarios (id_emp,precio_hora,horas_trab,fecha_ult_actualizacion,salario_bruto_mensual) "
                                + "VALUES ('"+id_emp+"','"+((Empleado)u).getSalario().getPrecioHora()+"','"+((Empleado)u).getSalario().getHorasTrabajadas()+"','"+dt.format(new Date())+"',"+((Empleado)u).getSalario().getSalarioBrutoMensual()+")");

                        ret = true;
                    }else{
                        System.out.println("Empleado con DNI duplicado en la Base de Datos.");
                    }
                }else if(u instanceof Socio){
                    //INSERCION DE SOCIOS
                    //Comprobar si socio esta en la base de datos
                    rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.dni = '"+u.getDni()+"' AND personas.tipo=3 "); 
                    rs.next();
                    if(rs.getInt(1)==1){
                        //El socio estaba dado de alta en la base de datos.
                        //HACER UPDATE DEL SOCIOS
                        st.executeUpdate("UPDATE personas SET estado = 1 WHERE personas.tipo=3 AND personas.dni='"+u.getDni()+"'");
                        ret = true;
                    }else if(rs.getInt(1)==0){
                        //El socio no existe en la base de datos
                        //HACER INSERCION DE SOCIO Y TARJETA

                        //INSERCION SOCIO
                        st.executeUpdate("INSERT INTO personas (dni,password,nombre,apellidos,tlf,email,fecha_alta,tipo,estado) "
                                + "VALUES ('"+u.getDni()+"','"+u.getPassword()+"','"+u.getNombre()+"','"+u.getApellidos()+"',"+u.getTlf()+",'"+u.getEmail()+"','"+dt.format(((Socio)u).getfAlta())+"',3,1)");
                        //CONSULTA PROXIMO ID A INSERTAR(Llevar control del id en las dos tablas que inserto al mismo tiempo)
                        rs = st.executeQuery("SELECT MAX(id) FROM PERSONAS");
                        rs.next();
                        int id_soc = rs.getInt(1); 
                        //INSERCION TARJETA
                        st.executeUpdate("INSERT INTO tarjetas (id_socio,credito) "
                                + "VALUES ("+id_soc+","+((Socio)u).getTarjetaSocio().getCredito()+")");

                        ret = true;
                    }else{
                        System.out.println("Socio con DNI duplicado en la Base de Datos.");
                    }
                }
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } finally {
                try {
                    rs.close();
                    st.close();
                    con.close();
                }catch (SQLException sqlex) {
                    System.out.println(sqlex.getMessage());
                }catch(Exception ex){
                    System.out.println(ex.getMessage());
                }
            }


        return ret;
    }
//Da de baja a un usuario en la base de datos(cambia su estado a 2)
    public static boolean bajaUsuario(Usuario u){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
       
        try {
            st = con.createStatement();
            //Comprobar si el empleado esta en la base de datos
            if(u instanceof Empleado){
                rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.dni = '"+u.getDni()+"' AND personas.tipo=2 ");
                rs.next();
                if(rs.getInt(1)==1){
                    //Si existe un empleado en la base de datos->Dale de baja
                    st.executeUpdate("UPDATE personas SET estado = 2 WHERE personas.tipo=2 AND personas.dni='"+u.getDni()+"'");
                    ret=true;
                }else if(rs.getInt(1)==2){
                    System.out.println("Empleado con DNI duplicado en la Base de Datos");
                }
            }
            else if(u instanceof Socio){
                rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.dni = '"+u.getDni()+"' AND personas.tipo=3 ");
                rs.next();
                if(rs.getInt(1)==1){
                    //Si existe un socio en la base de datos->Dale de baja
                    st.executeUpdate("UPDATE personas SET estado = 2 WHERE personas.tipo=3 AND personas.dni='"+u.getDni()+"'");
                    ret=true;
                }else if(rs.getInt(1)==2){
                    System.out.println("Socio con DNI duplicado en la Base de Datos");
                }
            }
        } catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch (Exception ex){
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
    
    public static boolean modificaUsuario(Usuario u){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try {
            st = con.createStatement();
            //Comprobar si el empleado esta en la base de datos
            if(u instanceof Empleado){
                rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.id= '"+((Empleado)u).getId()+"' AND personas.tipo=2 ");
                rs.next();
                if(rs.getInt(1)==1){
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    //Si existe un empleado en la base de datos->Dale de baja
                    st.executeUpdate("UPDATE personas "
                            + "SET nombre='"+u.getNombre()+"', apellidos='"+u.getApellidos()+"', dni='"+u.getDni()+"',email='"+u.getEmail()+"',tlf="+u.getTlf()+", fecha_alta='"+dt.format(((Empleado)u).getfAlta())+"'"
                            + " WHERE personas.tipo=2 AND personas.id="+((Empleado)u).getId()+"");
                    ret=true;
                }else if(rs.getInt(1)==2){
                    System.out.println("Empleado con DNI duplicado en la Base de Datos");
                }
            }
            else if(u instanceof Socio){
                rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                            + "WHERE personas.id= '"+((Socio)u).getId()+"' AND personas.tipo=3 ");
                rs.next();
                if(rs.getInt(1)==1){
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    //Si existe un empleado en la base de datos->Dale de baja
                    st.executeUpdate("UPDATE personas "
                            + "SET nombre='"+u.getNombre()+"', apellidos='"+u.getApellidos()+"', dni='"+u.getDni()+"',email='"+u.getEmail()+"',tlf="+u.getTlf()+", fecha_alta='"+dt.format(((Socio)u).getfAlta())+"'"
                            + " WHERE personas.tipo=3 AND personas.id="+((Socio)u).getId()+"");
                    ret=true;
                }else if(rs.getInt(1)==2){
                    System.out.println("Socio con DNI duplicado en la Base de Datos");
                }
            }
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
    
    public static boolean updateTarjetaSocio(Socio s){
        boolean ret = false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        
        try {
            st = con.createStatement();
            st.executeUpdate("UPDATE tarjetas SET credito="+s.getTarjetaSocio().getCredito()+",puntos="+s.getTarjetaSocio().getPuntos()+" WHERE num_tarjeta="+s.getTarjetaSocio().getNumTarjeta()+"");
            ret = true;
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } finally {
            try {
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }

}